package es.gesfutbol.dao;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.EquipEnPenyista;
import es.gesfutbol.domini.implementacio.Penya;
import es.gesfutbol.domini.implementacio.Penyista;
import es.gesfutbol.domini.implementacio.Pronostic;
import es.gesfutbol.domini.implementacio.UsuariRegistrat;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class PenyistaDao extends HibernateDao<Penyista, Long> implements IPenyistaDao{

	@Transactional(readOnly=true)
	public Penyista findByIdUsuari(Long idUsuari) {
		return (Penyista) this.getSessionFactory().getCurrentSession().createCriteria(Penyista.class)
					.add(Restrictions.eq("usuari.idUsuari", idUsuari)).uniqueResult();
	}

	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Penyista deproxy(Penyista penyista) {
		Penya penya = penyista.getPenya();
		this.getSessionFactory().getCurrentSession().lock(penya, LockMode.NONE);
		Hibernate.initialize(penya);
		penya = HibernateHelper.deproxy(penya, Penya.class);
		penyista.setPenya(penya);
		
		UsuariRegistrat usuari = penyista.getUsuari();
		Hibernate.initialize(usuari);
		usuari = HibernateHelper.deproxy(usuari, UsuariRegistrat.class);
		penyista.setUsuari(usuari);
		
		// Estadis Alternatius
		Set<EquipEnPenyista> equipsEnPenyista = penyista.getEquips();
		this.getSessionFactory().getCurrentSession().lock(penyista, LockMode.NONE);
		Hibernate.initialize(equipsEnPenyista);
		Iterator<EquipEnPenyista> itEquipsEnPenyistes = equipsEnPenyista.iterator();
		Set<EquipEnPenyista> equipsEnPenyista2 = new HashSet<EquipEnPenyista>();
		while (itEquipsEnPenyistes.hasNext()) {
			EquipEnPenyista eep = itEquipsEnPenyistes.next();
			Hibernate.initialize(eep);
			eep = HibernateHelper.deproxy(eep, EquipEnPenyista.class);
			equipsEnPenyista2.add(eep);
		}
		penyista.setEquips(equipsEnPenyista2);		
		
		return penyista;
	}
	
	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Penyista deproxyEquips(Penyista penyista) {
		
		// Estadis Alternatius
		Set<EquipEnPenyista> equipsEnPenyista = penyista.getEquips();
		this.getSessionFactory().getCurrentSession().lock(penyista, LockMode.NONE);
		Hibernate.initialize(equipsEnPenyista);
		Iterator<EquipEnPenyista> itEquipsEnPenyistes = equipsEnPenyista.iterator();
		Set<EquipEnPenyista> equipsEnPenyista2 = new HashSet<EquipEnPenyista>();
		while (itEquipsEnPenyistes.hasNext()) {
			EquipEnPenyista eep = itEquipsEnPenyistes.next();
			Hibernate.initialize(eep);
			eep = HibernateHelper.deproxy(eep, EquipEnPenyista.class);
			equipsEnPenyista2.add(eep);
		}
		penyista.setEquips(equipsEnPenyista2);		
		
		return penyista;
	}	
	
	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Set<Penyista> deproxyPronostics(Set<Penyista> penyistes){
		Set<Penyista> penyistes2 = new HashSet<Penyista>();
		Iterator<Penyista> itPen = penyistes.iterator();
		while (itPen.hasNext()) {
			Penyista p = itPen.next();
			this.getSessionFactory().getCurrentSession().lock(p, LockMode.NONE);
			Set<Pronostic> pronostics = p.getPronostics();
			Hibernate.initialize(pronostics);
			Iterator<Pronostic> itPro = pronostics.iterator();
			Set<Pronostic> pronostics2 = new HashSet<Pronostic>();
			while(itPro.hasNext()){
				Pronostic pron = itPro.next();
				Hibernate.initialize(pron);
				pron = HibernateHelper.deproxy(pron, Pronostic.class);
				pronostics2.add(pron);
			}
			p.setPronostics(pronostics2);
			penyistes2.add(p);	   
		}		
		return penyistes2;				
	}
	
	@Transactional(readOnly=true)
	public Penyista findAdministrador(Long idPenya) {
		Penyista p = (Penyista) this.getSessionFactory().getCurrentSession()
		.createCriteria(Penyista.class)
		.add( Restrictions.eq("administra", true) )
		.add( Restrictions.eq("penya.idPenya", idPenya) ) 
		.uniqueResult();		
	return p;	
	}
	

}
